home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- """Fixer for dict methods.
-
- d.keys() -> list(d.keys())
- d.items() -> list(d.items())
- d.values() -> list(d.values())
-
- d.iterkeys() -> iter(d.keys())
- d.iteritems() -> iter(d.items())
- d.itervalues() -> iter(d.values())
-
- Except in certain very specific contexts: the iter() can be dropped
- when the context is list(), sorted(), iter() or for...in; the list()
- can be dropped when the context is list() or sorted() (but not iter()
- or for...in!). Special contexts that apply to both: list(), sorted(), tuple()
- set(), any(), all(), sum().
-
- Note: iter(d.keys()) could be written as iter(d) but since the
- original d.iterkeys() was also redundant we don't fix this. And there
- are (rare) contexts where it makes a difference (e.g. when passing it
- as an argument to a function that introspects the argument).
- """
- from import pytree
- from import patcomp
- from pgen2 import token
- from import fixer_base
- from fixer_util import Name, Call, LParen, RParen, ArgList, Dot
- from import fixer_util
- iter_exempt = fixer_util.consuming_calls | set([
- 'iter'])
-
- class FixDict(fixer_base.BaseFix):
- PATTERN = "\n power< head=any+\n trailer< '.' method=('keys'|'items'|'values'|\n 'iterkeys'|'iteritems'|'itervalues') >\n parens=trailer< '(' ')' >\n tail=any*\n >\n "
-
- def transform(self, node, results):
- head = results['head']
- method = results['method'][0]
- tail = results['tail']
- syms = self.syms
- method_name = method.value
- isiter = method_name.startswith('iter')
- if isiter:
- method_name = method_name[4:]
-
- if not method_name in ('keys', 'items', 'values'):
- raise AssertionError, repr(method)
- head = [ n.clone() for n in head ]
- tail = [ n.clone() for n in tail ]
- if not tail:
- pass
- special = self.in_special_context(node, isiter)
- args = head + [
- pytree.Node(syms.trailer, [
- Dot(),
- Name(method_name, prefix = method.get_prefix())]),
- results['parens'].clone()]
- new = pytree.Node(syms.power, args)
- new.set_prefix(node.get_prefix())
- return new
-
- P1 = "power< func=NAME trailer< '(' node=any ')' > any* >"
- p1 = patcomp.compile_pattern(P1)
- P2 = "for_stmt< 'for' any 'in' node=any ':' any* >\n | comp_for< 'for' any 'in' node=any any* >\n "
- p2 = patcomp.compile_pattern(P2)
-
- def in_special_context(self, node, isiter):
- if node.parent is None:
- return False
- results = { }
- if node.parent.parent is not None and self.p1.match(node.parent.parent, results) and results['node'] is node:
- if isiter:
- return results['func'].value in iter_exempt
- return results['func'].value in fixer_util.consuming_calls
- results['node'] is node
- if not isiter:
- return False
- if self.p2.match(node.parent, results):
- pass
- return results['node'] is node
-
-
-